/*
 * @lc app=leetcode.cn id=3 lang=cpp
 *
 * [3] 无重复字符的最长子串
 */

#include <limits.h>

#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

// @lc code=start
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> charSet;
        int length = s.size();
        int right = -1;
        int ans = 0;

        // 枚举左指针的位置
        for (int i = 0; i < length; i++) {
            // 左指针右移一格，删除该元素
            if (i != 0) {
                charSet.erase(s[i -1]);
            }
            // 向右移动右指针
            while (right + 1 < length && !charSet.count(s[right + 1])) {
                charSet.insert(s[right + 1]);
                right++;
            }

            ans = max(ans, right - i + 1);
        }

        return ans;
    }
};
// @lc code=end

